package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpAdditionalFieldsDAO;
import org.jsola.hr.dto.EmpAdditionalFieldsAddDTO;
import org.jsola.hr.dto.EmpAdditionalFieldsUpdateDTO;
import org.jsola.hr.entity.EmpAdditionalFieldsDO;
import org.jsola.hr.query.EmpAdditionalFieldsQuery;
import org.jsola.hr.vo.EmpAdditionalFieldsListVO;
import org.jsola.hr.vo.EmpAdditionalFieldsVO;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;


/**
 * 员工额外字段信息表
 *
 * @author zhr
 */
public interface IEmpAdditionalFieldsService extends IService<IEmpAdditionalFieldsDAO, EmpAdditionalFieldsDO> {

    /**
     * 新增员工额外字段信息表
     *
     * @param empAdditionalFieldsAddDTO 新增员工额外字段信息表DTO
     * @param tokenUser                 当前用户
     * @return 员工额外字段信息表详情信息
     */
    EmpAdditionalFieldsVO save(EmpAdditionalFieldsAddDTO empAdditionalFieldsAddDTO, TokenUser tokenUser);

    /**
     * 修改员工额外字段信息表
     *
     * @param empAdditionalFieldsUpdateDTO 修改员工额外字段信息表DTO
     * @param tokenUser                    当前用户
     * @return 更新数量
     */
    int update(EmpAdditionalFieldsUpdateDTO empAdditionalFieldsUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工额外字段信息表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser              当前用户
     * @param empAdditionalFieldsIds 员工额外字段信息表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... empAdditionalFieldsIds);

    /**
     * 根据员工额外字段信息表id查找
     *
     * @param empAdditionalFieldsId 员工额外字段信息表id
     * @param siteId                所属站点id
     * @return 员工额外字段信息表详情信息
     */
    EmpAdditionalFieldsVO selectById(Long empAdditionalFieldsId, String siteId);

    /**
     * 查询员工额外字段信息表
     *
     * @param empAdditionalFieldsQuery 查询条件
     * @param siteId                   所属站点id
     * @return 员工额外字段信息表列表信息
     */
    List<EmpAdditionalFieldsListVO> select(EmpAdditionalFieldsQuery empAdditionalFieldsQuery, String siteId);


    /**
     * 查询员工额外字段信息表
     *
     * @param filedId 额外字段的id
     * @return 员工额外字段信息表列表信息
     */
    List<EmpAdditionalFieldsDO> selectByFiledId(Long filedId);

    /**
     * 查询员工额外字段信息表
     *
     * @param filedIds 额外字段的id
     * @return 员工额外字段信息表列表信息
     */
    List<EmpAdditionalFieldsDO> selectByFiledIds(List<Long> filedIds);

    /**
     * 查询具体的员工/预登记人员额外字段信息（empId：员工id/预登记人员id）
     *
     * @param filedId 额外字段id
     * @param empId   员工id/预登记人员id
     * @return 员工额外字段信息表列表信息
     */
    EmpAdditionalFieldsDO selectByFiledIdAndEmpId(Long filedId, String empId);

    /**
     * 查询具体的员工/预登记人员额外字段信息（empId：员工id/预登记人员id）
     *
     * @param filedIds 额外字段ids
     * @param empId    员工id/预登记人员id
     * @return 员工额外字段信息表列表信息
     */
    List<EmpAdditionalFieldsDO> selectByFiledIdsAndEmpId(List<Long> filedIds, String empId);

    /**
     * 查询具体的员工/预登记人员额外字段信息（empId：员工id/预登记人员id）
     *
     * @param filedIds 额外字段ids
     * @param empIds   员工ids/预登记人员ids
     * @return 员工额外字段信息表列表信息
     */
    Map<String, List<EmpAdditionalFieldsDO>> selectByFiledIdsAndEmpIds(List<Long> filedIds, List<String> empIds);

    /**
     * 查询员工额外字段信息表记录数
     *
     * @param empAdditionalFieldsQuery 查询条件
     * @param siteId                   所属站点id
     * @return 员工额外字段信息表记录数
     */
    int selectCount(EmpAdditionalFieldsQuery empAdditionalFieldsQuery, String siteId);

    /**
     * 分页查询员工额外字段信息表
     *
     * @param empAdditionalFieldsQuery 查询条件
     * @param siteId                   所属站点id
     * @return 员工额外字段信息表列表信息
     */
    Page<EmpAdditionalFieldsListVO> selectPage(EmpAdditionalFieldsQuery empAdditionalFieldsQuery, String siteId);


    /**
     * 根据员工额外字段信息表id查找
     *
     * @param empAdditionalFieldsId 员工额外字段信息表id
     * @param siteId                所属站点id
     * @return 员工额外字段信息表
     */
    EmpAdditionalFieldsDO selectDOById(Long empAdditionalFieldsId, String siteId);

    /**
     * 查询员工额外字段信息表
     *
     * @param empAdditionalFieldsQuery 查询条件
     * @param siteId                   所属站点id
     * @return 员工额外字段信息表列表
     */
    List<EmpAdditionalFieldsDO> selectDO(EmpAdditionalFieldsQuery empAdditionalFieldsQuery, String siteId);

    /**
     * 查询员工填写的某个模块的内容（type != 2的）
     *
     * @param empId      员工id
     * @param companyId  公司id
     * @param moduleCode 模块 为空查所有
     * @param siteId     站点id
     * @return list
     */
    List<EmpAdditionalFieldsDO> selectByCompanyId(String empId, String companyId, String moduleCode, String siteId);

    /**
     * 查询员工指定字段填写的的内容
     *
     * @param companyId 公司id
     * @param empId     员工id
     * @param fieldIds  指定字段
     * @return list
     */
    List<EmpAdditionalFieldsDO> selectByCompanyIdEmpIdAndFieldIds(String companyId, String empId, List<Long> fieldIds);

    /**
     * 查询员工填写的全部模块的内容
     *
     * @param empId  员工id
     * @param siteId 站点id
     * @return list
     */
    List<EmpAdditionalFieldsDO> selectByEmpId(String empId, String siteId);

    /**
     * 查询员工填写的全部模块的内容
     *
     * @param empIds 员工ids
     * @param siteId 站点id
     * @return list
     */
    List<EmpAdditionalFieldsDO> selectByEmpIds(List<String> empIds, String siteId);


    /**
     * 查询预登记人员id填写的全部模块的内容
     *
     * @param checkInId 预登记人员id
     * @param siteId    站点id
     * @return list
     */
    List<EmpAdditionalFieldsDO> selectByCheckInId(String checkInId, String siteId);

    /**
     * 保存员工动态表单的值，先删除之前填写的
     *
     * @param empId        员工id
     * @param companyId    公司id
     * @param moduleCode   模块code
     * @param fieldAddList 新增对象
     * @param tokenUser    当前登录用户
     */
    void savePreDelete(String empId, String companyId, String moduleCode, List<EmpAdditionalFieldsAddDTO> fieldAddList, TokenUser tokenUser);
}


